//
// Created by LiuYou on 2021/5/12.
//

#include <tuple>
#include <vector>
#include <list>
#include <iostream>

/**
 * @brief tuple
 * 
 * 当我们希望将一些数据组合成单一对象, 但又不想麻烦地定义一个新数据结构来表示这些数据时, tuple是非常有用的。
 * 
 * tuple的所有成员都是 public 的。
 * 可以将tuple看作一个"快递而随意的"数据结构。
 *
 * 使用tuple返回多个值, tuple的一个常见用途是从一个函数返回多个值。
 * 
 * @return 0 
 */
int main() {
    // 定义初始化tuple
    std::tuple<std::string, std::vector<double>, int, std::list<int>> someVal("constants", {3.14, 3.245}, 42,
                                                                              {0, 1, 2, 3, 4});
    // TODO 注意: 不能使用 get 传入整型变量！！！！
/*    for (int i = 0; i < std::tuple_size<decltype(someVal)>::value; ++i) {
        std::get<>(someVal);
    }*/
    // 使用 make_tuple, 生成tuple对象
/*    const std::bookTuple<std::__decay_and_strip<const char (&)[10]>::__type, int, double>& bookTuple = std::make_tuple(
            "2021-5-12", 3, 10.11);*/
    auto bookTuple = std::make_tuple("2021-5-12", 3, 10.11);
    auto bookName = std::get<0>(bookTuple);
    auto count = std::get<1>(bookTuple);
    auto price = std::get<2>(bookTuple);

    size_t bookTupleSize = std::tuple_size<decltype(bookTuple)>::value;
    std::cout << bookName << " " << count << " " << price << std::endl;
    std::cout << "bookTupleSize: " << bookTupleSize << std::endl;


    return 0;
}